from model import db
from model.nullobject import NULL_OBJECT
from model.tables import Blog

def DeleteInstance(instance):
    if not instance:
        return
    db.session.delete(instance)
    db.session.commit()

def UpdateInstance(instance, data=None):
    if instance is None:
        return

    if data is not None:
        for key, value in data.items():
            if hasattr(instance, key) and value is not None:
                setattr(instance, key, value)

    db.session.add(instance)
    db.session.commit()

def QueryOneInstance(class_, filter_):
    instance = class_.query.filter_by(**filter_).first()
    return instance if instance is not None else NULL_OBJECT

def QueryMultipleInstances(class_, filter_):
    return class_.query.filter_by(**filter_).all()

def QueryPaginatedPosts(
        query,  # 已经过滤的 Blog.query（如 filter_by(checked=True, passed=True)）
        limit: int = 10,  # 每页数量（默认 10）
        asc: bool = False,  # 是否升序（默认 True，即升序）
        offset: int = None,  # 当前偏移量（可选，未提供时自动初始化）
):
    """
    基于自增 id 的分页查询函数
    参数:
        query: 已经过滤的 Blog.query
        offset: 当前偏移量（可选，未提供时自动初始化）
        limit: 每页数量（默认 10）
        asc: 是否升序排序（默认 True，即升序）
    返回:
        {
            'blogs': [Blog.to_dict()],  # 博客列表（字典格式）
            'offset': int,  # 新的偏移量（最后一个 Blog.id 或初始值）
        }
    """
    # 0. 初始化 offset（如果未提供）
    if offset is None:
        if not asc:
            # 降序：初始 offset = 最大 id + 1（后续查询用 id < offset）
            max_id = db.session.query(db.func.max(Blog.id)).scalar() or 0
            offset = max_id + 1
        else:
            # 升序：初始 offset = 0（后续查询用 id > offset）
            offset = 0

    # 1. 执行分页查询
    if not asc:
        blogs = query.filter(Blog.id < offset).order_by(Blog.id.desc()).limit(limit).all()
    else:
        blogs = query.filter(Blog.id > offset).order_by(Blog.id.asc()).limit(limit).all()

    # 2. 更新 offset（取最后一条的 id，如果没有数据则保持原 offset）
    new_offset = blogs[-1].id if blogs else offset

    return blogs,new_offset